package com.sunni.service.Impl;

import com.sunni.dao_old.UserDao;
import com.sunni.service.UserService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

//<bean id="userService" class="com.sunni.service.Impl.UserServiceImpl">
//@Component("userService") //语义不明确
@Service("userService") // 语义明确，相当于@Component的子类
//@Scope("prototype") // 多例
@Scope("singleton")  //单例
public class UserServiceImpl implements UserService {

    @Value("${jdbc.driver}") // @Value注入普通类型值+结合SpEL加载外部properties文件内的数据
    private String driver;

    //<property name="userDao" ref="userDao"></property>
//    @Autowired
//    @Qualifier("userDao") //删了亦可以，只留@AutoWired相当于getBean(数据类型)
    @Resource(name = "userDao")
    private UserDao userDao;
    /*把userDao 的set方法删了也ok。
      原来：xml文件，需要调用属性的set方法 进行反射，完成property赋值
      现在：注解，自动生成属性的set方法
    */

    /*
    @Autowired + @Qualifier("<bean> id") : 根据id 注入。（getBean(id)）
    @Resource(name = "<bean> id") : 根据id 注入。（getBean(id)）
    -------------
    @Autowired : 根据数据类型(属性的数据类型) 注入，自动到spring找相同数据类型的<bean>。(getBean(类型))
     */

    @Override
    public void save() {
        System.out.println("driver = " + driver);
        userDao.save();
    }

    @PostConstruct //init-method 在哪个方法上加，哪个就是init初始化方法。解析: Post-之后, Construct-构造方法, 在构造方法之后执行。
    public void initMethod(){
        System.out.println("init-method running...");
    }

    @PreDestroy //destroy-method 在哪个方法上加，哪个就是destroy销毁方法。
    public void destroyMethod(){
        System.out.println("destroy-method running...");
    }
}
